package com.ruoyi.equip.vert.parser;

import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.equip.vert.constant.TransferEnum;
import com.ruoyi.equip.vert.domain.TcpParserEntity;
import com.ruoyi.equip.vert.service.TransferStrategy;
import io.vertx.core.buffer.Buffer;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static com.ruoyi.common.utils.net.HexUtil.hexListToStr;
import static com.ruoyi.common.utils.net.HexUtil.hexStrToInt;

@Slf4j
public class DataReader
{

    public static Map<String, String> readHandleMap = new HashMap<>();

    public static void decodeReader(Buffer buffer, String handlerID)
    {
        List<String> hexList = new ArrayList<>();

        for (int i = 0; i < buffer.length(); i++) {
            byte b = buffer.getByte(i);
            String hex = String.format("%02X", b);
            hexList.add(hex);
        }
        // 进行数据校验？
        log.info("TCP REACIVE为:{}", hexList);
        // 解析内容装进实体类
        TcpParserEntity tcpParserEntity = new TcpParserEntity();

        int curPos = 1;
        String readerID = hexListToStr(hexList, curPos, curPos + 4);
        readHandleMap.put(readerID, handlerID);
        tcpParserEntity.setReaderId(readerID);
        curPos = curPos + 4;
        String optType = hexListToStr(hexList, curPos, curPos + 2);
        tcpParserEntity.setOptType(optType);
        curPos = curPos + 2;
        String paramLen = hexList.get(curPos++);
        int len = hexStrToInt(paramLen);
        List<String> paramList = hexList.subList(curPos, curPos + len);
        tcpParserEntity.setParam(paramList);
        tcpParserEntity.setHandlerID(handlerID);


        log.info("解析数据内容:{}", tcpParserEntity.toString());

        // 解析内容
        if (StringUtils.isNotEmpty(optType)) {
            TransferStrategy strategyClass = TransferEnum.getStrategyClass(optType);
            if (StringUtils.isNull(strategyClass)) {
                log.info("错误指令码:{}", optType);
            } else {
                strategyClass.transfer(tcpParserEntity);
            }
        }

    }


}
